# 导入必要的库
import requests
import json
import time
import pandas as pd
import csv


# 函数：发起请求到京东并获取特定页面的数据
def start(product_id, score, page):
    # 构建京东商品评论页面的URL
    url = ('https://club.jd.com/comment/productPageComments.action?'
           f'&productId={product_id}'  # 商品ID
           f'&score={score}'  # 0表示所有评论，1表示好评，2表示中评，3表示差评，5表示追加评论
           '&sortType=5'  # 排序类型（通常使用5）
           f'&page={page}'  # 要获取的页面数
           '&pageSize=10'  # 每页评论数
           '&isShadowSku=0'
           '&fold=1')

    # 设置headers以模拟浏览器请求
    headers = {
        "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/86.0.4240.198 Mobile Safari/537.36"
    }

    time.sleep(2)
    # 发送GET请求获取数据
    response = requests.get(url=url, headers=headers)
    # 将返回的JSON数据解析为字典
    data = json.loads(response.text.removeprefix("fetchJSON_comment98(").removesuffix(");"))
    return data


# 解析函数：从返回的数据中提取所需信息
def parse(data, product_id, rank):
    items = data['comments']
    for i in items:
        yield (
            product_id,
            i['score'],
            rank,
            i['content']
        )


# CSV函数：将数据写入CSV文件
def save_csv(items, file_path='../data_csv/comment/comments.csv'):
    # 如果文件不存在，创建文件并写入列名
    try:
        pd.read_csv(file_path)
    except FileNotFoundError:
        df = pd.DataFrame(columns=['商品id', '评分', '等级', '内容'])
        df.to_csv(file_path, index=False, encoding='utf-8-sig')

    # 将数据写入CSV文件，header参数用于控制是否写入列名
    df = pd.DataFrame(items, columns=['商品id', '评分', '等级', '内容'])
    df.to_csv(file_path, index=False, mode='a', header=False, encoding='utf_8_sig')


# 主函数：控制整个爬取过程
def main(product_id, score):
    if score == '1':
        total_pages = 2  # 差评
    elif score == '2':
        total_pages = 2  # 中评
    elif score == '3':
        total_pages = 10  # 好评
    else:
        total_pages = 0

    for j in range(total_pages):
        time.sleep(1.5)
        current_page = j + 1
        # 发起请求并获取数据
        data = start(product_id, score, current_page)
        # 解析数据
        parsed_data = parse(data, product_id, score)
        # 将数据写入CSV文件
        save_csv(parsed_data)


# 如果作为独立脚本运行，则执行主函数
if __name__ == '__main__':
    # 打开CSV文件
    with open('../data_csv/product_id/data_sku_list.csv', mode='r') as csvfile:
        # 创建CSV读取器
        reader = csv.reader(csvfile)
        k = 1
        # 遍历每一行并输出
        for row in reader:
            if row == ['data_spu']:
                continue
            main(row[0], '1')
            main(row[0], '2')
            main(row[0], '3')
            print('第' + str(k) + '个商品抓取完毕')
            k += 1
